using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using ToyStore.Domain.System;

namespace ToyStore.Domain.Store
{
	/// <summary>
	/// Klasa reprezentująca użytkownika systemu.
	/// </summary>
	[DisplayName("Produkt")]
	public class Product : BaseEntity
	{
		/// <summary>
		/// Konstruktor.
		/// </summary>
		public Product()
		{
			OrderedProducts = new List<OrderedProduct>();
			Categories = new List<Category>();
			Pictures = new List<Picture>();
			Opinions = new List<Opinion>();
		}

		/// <summary>
		/// Lista zamówień, w których znajduje się produkt.
		/// </summary>
		[DisplayName("Zamówienia")]
		public virtual IList<OrderedProduct> OrderedProducts { get; set; }

		/// <summary>
		/// Kategorie produktu.
		/// </summary>
		[DisplayName("Kategorie")]
		public virtual IList<Category> Categories { get; set; }
		
		/// <summary>
		/// Kontrahent dostarczający produkt.
		/// </summary>
		[DisplayName("Kontrahent")]
		public virtual Contractor Contractor { get; set; }
		
		/// <summary>
		/// Nazwa produktu.
		/// </summary>
		[DisplayName("Nazwa"), StringLength(200), Required(ErrorMessage = "Musisz podać nazwę produktu")]
		public virtual string Name { get; set; }
        /// <summary>
        /// Nazwa produktu skrucona
        /// </summary>
        public virtual string NameShort
        {
            get 
            { 
                return Name.Length > 65 ? Name.Substring(0, 60) + "..." : Name; 
            }
        }
		
		/// <summary>
		/// Opis produktu.
		/// </summary>
		[DisplayName("Opis"), StringLength(4000), Required(ErrorMessage = "Musisz podać opis produktu")]
		public virtual string Description { get; set; }
        /// <summary>
        /// Krótki opis produktu
        /// </summary>
        public virtual string DescriptionShort 
        { 
            get 
            {
                return Description.Length > 200 ? Description.Substring(0, 200) + "..." : Description;
            } 
        }
		/// <summary>
		/// Status produktu.
		/// </summary>
		[DisplayName("Status"), Required(ErrorMessage = "Musisz podać status produktu")]
		public virtual ProductStatus ProductStatus { get; set; }
		
		/// <summary>
		/// Cena produktu.
		/// </summary>
		[DisplayName("Cena"), Required(ErrorMessage = "Musisz podać cenę netto")]
		public virtual decimal PriceNetto { get; set; }
        
        /// <summary>
        /// Cena brutto produktu
        /// </summary>
        public virtual decimal PriceBrutto
        {
            get
            {
                return Vat != null ? PriceNetto * (1 + Vat.Value / 100.0m ) : PriceNetto;
            }
        }

		/// <summary>
		/// Podatek.
		/// </summary>
		[DisplayName("Podatek"), Required(ErrorMessage = "Musisz podać wartość podatku")]
		public virtual Vat Vat { get; set; }
		
		/// <summary>
		/// Lektor.
		/// </summary>
		[DisplayName("Lektor")]
		public virtual Reader Reader { get; set; }
		
		/// <summary>
		/// Długość nagrania.
		/// </summary>
		[DisplayName("Długość nagrania")]
		public virtual decimal Length { get; set; }
		
		/// <summary>
		/// Autor.
		/// </summary>
		[DisplayName("Autor")]
		public virtual Author Author { get; set; }
	
		/// <summary>
		/// Zdjęcia produktu.
		/// </summary>
		[DisplayName("Zdjęcia")]	
		public virtual IList<Picture> Pictures { get; set; }
		
		/// <summary>
		/// Fragment nagrania.
		/// </summary>
		[DisplayName("Fragment")]
		public virtual string SampleUrl { get; set; }
		
		/// <summary>
		/// Ocena produktu.
		/// </summary>
		[DisplayName("Ocena")]
		public virtual decimal Rating { get; set; }
		
		/// <summary>
		/// Opinie na temat produktu.
		/// </summary>
		[DisplayName("Opinie")]
		public virtual IList<Opinion> Opinions { get; set; }
	}
}
